perm filename UP2DDT.FAI[SS,SYS]1 blob sn#415785 filedate 1979-02-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	P2NUM P1DDTF P1CHRI P1FLGO P1BPTO P1BPTX P1OCNT NOP2HG P2UPTI P2TSUP ACWPRV INTELF BUFSIZ A B C D P LPDL PDL DDTACT START GETDDT DDTWAT INDDT LISTEN NOACW NOP2 MAIN GOTALT NOTALT GOTCH NOCTL NOIN CDISMI REINIT LEAVE LOST YESCHK CPOPJ PRUPTM DECOUT DECOUR
C00015 ENDMK
C⊗;
;P2NUM P1DDTF P1CHRI P1FLGO P1BPTO P1BPTX P1OCNT NOP2HG P2UPTI P2TSUP ACWPRV INTELF BUFSIZ A B C D P LPDL PDL DDTACT START GETDDT DDTWAT INDDT LISTEN NOACW NOP2 MAIN GOTALT NOTALT GOTCH NOCTL NOIN CDISMI REINIT LEAVE LOST YESCHK CPOPJ PRUPTM DECOUT DECOUR
	TITLE UP2DDT -- PROGRAM TO CONTROL P2 EDDT FROM P1

P2NUM←←210		;P2COMM CELL FLAGS P2 RUNNING
P1DDTF←←213		;P2COMM CELL TO SETOM TO GET P2 INTO DDT
P1CHRI←←214		;P2COMM CELL TO PUT CHAR INTO FOR I/P
P1FLGO←←215		;P2COMM CELL GETS +N TO READ O/P INTO N-CHAR BUFFER
			; 0 MEANS HOLD O/P, -1 WHEN NOT IN USE
P1BPTO←←216		;P2COMM CELL HOLDING BPT USED TO STORE O/P
P1BPTX←←217		;P2COMM CELL HOLDING INITIAL VALUE FOR P2BPTO
P1OCNT←←220		;P2COMM CELL WITH SIZE IN CHARS OF O/P BUFFER
NOP2HG←←221		;SET TO -1 TO TELL P1 NOT TO HUNG TIMEOUT P2 DEVICES
P2UPTI←←222		;P2 SYSTEM'S UPTIME IN TICKS
P2TSUP←←223		;SET TO -1 TO SUPPRESS TYPEOUT ON P2 CTY WHILE WE'RE HERE

ACWPRV←←40
INTELF←←100000		;VERY LIKELY INTERRUPT
BUFSIZ←←36		;SIZE OF TTY OUTPUT BUFFER IN WORDS

A←1
B←2
C←3
D←4
P←17

LPDL←←20
PDL:	BLOCK LPDL

;DDT's special activation table!  Taken from DDT[S,SYS].
;Don't activate on operators, only on commands that don't require altmode.
DDTACT:	777777,,777764	;Don't activate on space, double quote, number-sign
	000100,,032400	;Do activate on /:;=?
	000000,,374000	;Do activate on [\]↑← and left quote
	000001,,400020	;Don't activate on BS -- BSACT gives us BS in empty line

START:	RESET
	MOVE P,[IOWD LPDL,PDL]
	SETZM LEAVEF		;NOT TIME TO EXIT YET
	MOVSI A,ACWPRV		;NEED ACW TO GET P2COMM INTO HISEG
	SETPRV A,
	TLNN A,ACWPRV		;GOT IT?
	JRST NOACW		;OH WELL
	P2UUO 4,		;GET P2 INTO HISEG
	 JRST NOP2		;CAN'T
	PUSHJ P,PRUPTM		;TYPE P2'S UPTIME
	SKIPN 400000+P2NUM	;WARN USER IF P2 ISN'T RUNNING
	OUTSTR [ASCIZ /P2SYS not running. (P2NUM zero)
/]
	OUTSTR [ASCIZ/Suppress P1 hung timeouts for P2 devices? /]
	PUSHJ P,YESCHK		;SKIP IF ANSWER IS NO
	 SETOM 400000+NOP2HG
	MOVE A,400000+P1BPTX	;INITIAL VALUE FOR O/P BPT
	MOVEM A,400000+P1BPTO	;START O/P BPT
	MOVE B,400000+P1OCNT	;HOW MANY CHARS FIT IN BUFFER
	MOVEM B,400000+P1FLGO	;START COUNT
	OUTSTR [ASCIZ/Suppress typeout on P2 CTY? /]
	PUSHJ P,YESCHK		;SKIP IF NO
	 SETOM 400000+P2TSUP	;YES, SET SUPPRESS FLAG
	OUTSTR [ASCIZ/Send P2 to DDT now? /]
	PUSHJ P,YESCHK		;SKIP IF ANSWER IS NO
	 JRST GETDDT
	MOVEI A,[ASCIZ/OK, you're parallel to the P2 CTY.
/]
	SKIPGE 400000+P2TSUP	;SKIP UNLESS SUPPRESSING P2 CTY TYPEOUT
	MOVEI A,[ASCIZ/OK, you're the P2 CTY.
/]
	OUTSTR (A)
	JRST LISTEN

GETDDT:	SETOM 400000+P1DDTF	;TELL P2 TO GO TO DDT
	MOVEI A,1		;WAIT FOR IT TO GET THERE
	SLEEP A,
	SKIPE 400000+P1DDTF	;IN DDT YET?
	SLEEP A,
	SKIPE 400000+P1DDTF	;IN DDT YET?
	SLEEP A,
	SKIPE 400000+P1DDTF	;IN DDT YET?
	SLEEP A,
	SKIPE 400000+P1DDTF	;IN DDT YET?
	SLEEP A,		;GIVE IT ONE MORE CHANCE
	SKIPN 400000+P1DDTF	;IN DDT YET?
	JRST INDDT		;YES, OK
	OUTSTR [ASCIZ /You'll have to get P2 into DDT manually.
/]
DDTWAT:	MOVEI A,1		;WAIT FOR P2 IN DDT
	SLEEP A,
	SKIPE 400000+P1DDTF
	JRST DDTWAT
INDDT:	OUTSTR [ASCIZ /OK, you're in P2 EDDT.
/]
LISTEN:	SETACT [DDTACT]		;USE SAME SPECIAL ACTIVATION TABLE AS DDT
	MOVE A,[-2,,[11000,,200↔001000,,100]]
	TTYSET A,		;NO ECHOING, LET P2 DO IT
	MOVEI A,CDISMI
	MOVEM A,JOBAPR↑
	MOVEI A,INTELF
	INTENB A,
	MOVE A,[400006,,MAIN]
        SPCWGO A,
	CLKINT 4*=60*=60	;RUN EVERY 4 MINUTES TO AVOID AUTOLOGOUT
	IWAIT
	SKIPN LEAVEF		;TIME TO GO?
	JRST .-2		;NO, LOOP FOREVER
	EXIT			;STAGE RIGHT

NOACW:	OUTSTR [ASCIZ /You must have ACWPRV to run this program.
/]
	EXIT

NOP2:	OUTSTR [ASCIZ /I can't access P2 memory.  Try FIXP2.
/]
	EXIT

MAIN:	JRST 2,@[.+1]		;OUT OF WONDERFUL IOT-LOSER MODE
	SKIPE 400000+P1CHRI	;DON'T LOSE A CHAR
	JRST NOIN
	AOSE ALTMOD#		;DID WE JUST READ AN ALTMODE?
	JRST NOTALT
	INCHRS A
	 JRST GOTALT		;STILL LOOKING FOR CHAR AFTER ALTMODE
	MOVEI B,(A)
	ANDI B,177		;NO BITS
	CAIL B,"0"		;IF CHAR AFTER ALTMODE IS A DIGIT,
	CAILE B,"9"		; THEN WE STILL WANT TO ACTIVATE ON SINGLE CHAR
	JRST GOTCH		;NOT A DIGIT
	SETOM ALTMOD		;SO STILL ACTIVATE ON SINGLE CHAR
	JRST GOTCH		;GO PASS THE DIGIT ALONG

GOTALT:	SETOM ALTMOD		;HAVEN'T SEEN A CHAR SINCE THE ALTMODE
	JRST NOIN

NOTALT:	INCHSL A		;USER WANT TO TYPE INPUT?
	 JRST NOIN		;ALREADY I/P FOR P2, OR NOTHING TYPED, TRY FOR O/P
GOTCH:	CAIN A,15
	INCHRS B		;DISCARD LF
	 JFCL
	CAIE A,705
	CAIN A,745
	JRST LEAVE		;CONTROL-META-E
	CAIE A,305
	CAIN A,345
	JRST LEAVE		;CONTROL-E
	CAIN A,5
	JRST LEAVE		;ASCII CONTROL-E
	CAIN A,175
	SETOM ALTMOD		;FLAG THAT NEXT CHAR SHOULD ACTIVATE
	TRNN A,200		;SAIL CONTROL BIT ON?
	JRST NOCTL		;NO
	ANDI A,177		;YES, CONVERT TO ASCII CONTROL
	CAIGE A,100
	JRST NOCTL		;CAN'T CONTROLIFY THIS SMALL A CODE
	CAIL A,140
	SUBI A,40		;CONVERT LC TO UC FIRST
	SUBI A,100		;CONTROLIFY THE CHAR
NOCTL:	ANDI A,177		;WHO KNOWS WHAT P2 DOES WITH BUCKY BITS
	MOVEM A,400000+P1CHRI	;GIVE CHAR TO P2
NOIN:	MOVE A,400000+P1BPTX	;IS THERE ANY OUTPUT WAITING?
	CAMN A,400000+P1BPTO	;(INITIAL BPT DIFFERENT FROM CURRENT BPT?)
CDISMI:	DISMIS			;NO, NO MORE TO DO
	SETZB B,C
	PTOCNT B		;GET COUNT OF CHARS STILL IN OUR OUTPUT BUFFER
	ADD C,400000+P1OCNT	;MAX NUMBER OF CHARS WE MIGHT GET FROM P2
	CAIL C,BUFSIZ*4-1	;IS THERE ENOUGH ROOM IN OUR OUTPUT BUFFER?
	DISMIS			;NO, WAIT TILL LATER TO TRY READING FROM P2
	MOVEI B,0		;YES, FIRST FREEZE P2 OUTPUT
	EXCH B,400000+P1FLGO	;WAS IT ALREADY FROZEN?
	JUMPG B,.-2		;NO, WAIT FOR THINGS TO SETTLE DOWN
	JUMPL B,LOST		;WE WAITED TOO LONG, P2 TURNED US OFF
	MOVE C,400000+P1BPTO	;OK, GET O/P BPT
	ADDI C,400000		;MAKE IT RELATIVE TO HISEG ORIGIN
	IDPB B,C		;MAKE SURE OUTPUT STRING ENDS WITH A NULL
	OUTSTR 400000(A)	;TYPE THE STUFF (WE BETTER BE FASTER THAN 110 BAUD!)
REINIT:	MOVEM A,400000+P1BPTO	;RESTART O/P BPT
	MOVE B,400000+P1OCNT	;HOW MANY CHARS FIT IN BUFFER
	MOVEM B,400000+P1FLGO	;RESTART COUNT
	DISMIS

LEAVE:	SETOM 400000+P1FLGO	;NO LONGER READING OUTPUT
	SETZM 400000+NOP2HG	;NO LONGER PREVENTING P2 HUNG TIMEOUTS
	SETZM 400000+P2TSUP	;NO LONGER SUPPRESSING P2 CTY TYPEOUT
	SETOM LEAVEF#		;TELL MAIN PROGRAM TO LEAVE
	INTIPI [0↔INTELF]
	 JFCL
	SPCWAR 'SSW'		;FLUSH
	DISMIS

LOST:	OUTSTR [ASCIZ / (lost some!) /]
	JRST REINIT

YESCHK:	INCHRW A
	CAIN A,15
	INCHRW B		;DISCARD LF
	CAIE A,15
	OUTSTR [ASCIZ/
/]
	ANDI A,137		;NO BUCKY BITS, UPPER CASE ONLY
	CAIE A,"Y"
	AOS (P)
CPOPJ:	POPJ P,

PRUPTM:	OUTSTR [ASCIZ\P2 uptime is:  \]
	MOVE A,400000+P2UPTI	;GET P2'S UPTIME IN TICKS
	IDIVI A,=60		;TICKS IN B, SECONDS IN A
	PUSH P,B
	IDIVI A,=60		;SECONDS IN B, MINUTES IN A
	PUSH P,B
	IDIVI A,=60		;HOURS IN A, MINUTES IN B
	PUSH P,B
	IDIVI A,=24		;DAYS IN A, HOURS IN B
	PUSH P,B
	MOVEI C,0		;HAVEN'T PRINTED ANYTHING YET
	MOVEI D,[ASCIZ/ day/]
	PUSHJ P,DECOUT		;PRINT DECIMAL NUMBER OF DAYS
	POP P,A
	MOVEI D,[ASCIZ/ hour/]
	PUSHJ P,DECOUT		;PRINT NUMBER OF HOURS
	POP P,A
	MOVEI D,[ASCIZ/ min/]
	PUSHJ P,DECOUT		;PRINT MINUTES
	POP P,A
	MOVEI D,[ASCIZ/ sec/]
	PUSHJ P,DECOUT		;PRINT SECONDS
	POP P,A
	MOVEI D,[ASCIZ/ tick/]
	PUSHJ P,DECOUT		;PRINT TICKS
	SKIPN C
	OUTCHR ["0"]		;DIDN'T PRINT ANYTHING, MUST BE 0 UPTIME
	OUTSTR [ASCIZ /
/]
	POPJ P,

DECOUT:	SKIPN C			;HAVE WE ALREADY PRINTED SOMETHING?
	JUMPE A,CPOPJ		;NO, THEN DON'T PRINT A LEADING ZERO QUANTITY
	SKIPE C			;OMIT LEADING COMMA
	OUTSTR [ASCIZ /, /]
	ADDI C,1		;COUNT FIELDS (MAINLY BE NON-ZERO)
	PUSH P,A
	PUSHJ P,DECOUR		;PRINT NUMBER
	POP P,A
	OUTSTR (D)		;PRINT UNITS
	CAIE A,1
	OUTCHR ["s"]
	POPJ P,

DECOUR:	IDIVI A,=10
	HRLM B,(P)
	SKIPE A
	PUSHJ P,DECOUR		;NEXT DIGIT
	HLRZ A,(P)
	ADDI A,"0"
	OUTCHR A
	POPJ P,

	END START